package com.miage.itrading.gui;

import it.cnr.imaa.essi.lablib.gui.checkboxtree.CheckboxTree;
import it.cnr.imaa.essi.lablib.gui.checkboxtree.TreeCheckingEvent;
import it.cnr.imaa.essi.lablib.gui.checkboxtree.TreeCheckingListener;
import it.cnr.imaa.essi.lablib.gui.checkboxtree.TreeCheckingModel;

import java.awt.BorderLayout;
import java.util.List;

import javax.swing.JInternalFrame;
import javax.swing.JOptionPane;
import javax.swing.tree.DefaultMutableTreeNode;

import com.miage.itrading.decorateurs.Indicateurs;


public class PartieDroite extends JInternalFrame {
	
	public static float X 		= 0.85f;
	public static float Y		= 0;
	public static float WIDTH 	= 0.15f;
	public static float HEIGHT 	= 1f;

	private static final long serialVersionUID = -5364915907965806159L;
	private FenetrePrincipale parent;
	private CheckboxTree arbre;
	private TreeCheckingModel checkingModel;
	public PartieDroite(FenetrePrincipale main){
        super("Cotation - iTrading",  
                true, //resizable
                true, //closable
                true, //maximizable
                true);//iconifiable
		this.parent = main ;
		
		setLocation((int) (parent.getScreenSize().width * X), 
					(int) (parent.getScreenSize().height * Y));

		setSize((int) (parent.getScreenSize().width * WIDTH), 
				(int) (parent.getScreenSize().height * HEIGHT));
		
		setTitle("Indicateurs - iTrading");
		
		setResizable(true);
		
		arbre = constructionArbre();
		arbre.getCheckingModel().setCheckingMode(TreeCheckingModel.CheckingMode.SIMPLE);
		checkingModel = ((CheckboxTree)arbre).getCheckingModel();

		checkingModel.setPathEnabled(arbre.getPathForRow(0), false);
		checkingModel.setPathEnabled(arbre.getPathForRow(1), false);
		checkingModel.setPathEnabled(arbre.getPathForRow(2), false);

		arbre.addTreeCheckingListener(new TreeCheckingListener() {

			public void valueChanged(TreeCheckingEvent e) {
				if(e.isCheckedPath())
				{

					if(parent.centre.getCotation() == null){
						//Sélection d'une valeur
						JOptionPane.showMessageDialog(null,"Veuillez sélectionner une valeur");
						checkingModel.toggleCheckingPath(e.getPath());
					}
					else {

						Indicateurs ind = new Indicateurs(parent.centre.getCotation());

						System.out.println(e.getPath().getLastPathComponent()+" vient d'etre coché");

						if(e.getPath().getLastPathComponent().toString().equals("MM")){
							String retour = JOptionPane.showInputDialog("Veuillez saisir les périodes à afficher", "50;150");

							if(retour == null){
								checkingModel.toggleCheckingPath(e.getPath());
							}
							else{
								for (String s : retour.split(";")){

									try {
										int periode = Integer.parseInt(s);
										List<Float> l =  ind.moyenneMobile(periode);
										int[] periodes = {periode};
										parent.centre.ajouterIndicateurSurCours(e.getPath().getLastPathComponent().toString(), l, periodes);
									}
									catch(java.lang.NumberFormatException ex){
										checkingModel.toggleCheckingPath(e.getPath());
										JOptionPane.showMessageDialog(null, "La période doit être un nombre entier" );
									}
								}
							}
						}
						if(e.getPath().getLastPathComponent().toString().equals("MMP")){
							String retour = JOptionPane.showInputDialog("Veuillez saisir les périodes à afficher", "50;150");
							if(retour != null){
								for (String s : retour.split(";")){

									try {
										int periode = Integer.parseInt(s);
										List<Float> l =  ind.moyenneMobilePonderee(periode);
										int[] periodes = {periode};
										parent.centre.ajouterIndicateurSurCours("MMP", l, periodes);
									}
									catch(java.lang.NumberFormatException ex){
										JOptionPane.showMessageDialog(null, "Un entier doit être saisi" );
										checkingModel.toggleCheckingPath(e.getPath());
									}
								}
							}
							else checkingModel.toggleCheckingPath(e.getPath());
						}
						if(e.getPath().getLastPathComponent().toString().equals("MME")){
							String retour = JOptionPane.showInputDialog("Veuillez saisir les périodes à afficher", "50;150");
							if(retour != null){
								for (String s : retour.split(";")){

									try {
										int periode = Integer.parseInt(s);
										List<Float> l =  ind.moyenneMobileExponentielle(periode);
										int[] periodes = {periode};
										parent.centre.ajouterIndicateurSurCours("MME", l, periodes);
									}
									catch(java.lang.NumberFormatException ex){
										JOptionPane.showMessageDialog(null, "Un entier doit être saisi" );
										checkingModel.toggleCheckingPath(e.getPath());
									}
								}
							}
							else checkingModel.toggleCheckingPath(e.getPath());
						}
						if(e.getPath().getLastPathComponent().toString().equals("MACD")){
							String retour = JOptionPane.showInputDialog("Veuillez saisir la période courte et la periode longue séparé par ';' ", "26;12");
							if(retour != null){
								if(retour.split(";").length != 2){
									JOptionPane.showMessageDialog(null, "Deux valeurs doivent etre saisies" );
									checkingModel.toggleCheckingPath(e.getPath());
								}
							}
							try {
								int periodeCourte = Integer.parseInt(retour.split(";")[1]);
								int periodeLongue = Integer.parseInt(retour.split(";")[0]);
								List<Float> l =  ind.MACD(periodeLongue, periodeCourte);
								int[] periodes =  {periodeLongue,periodeCourte};
								parent.centre.ajouterIndicateur("MACD", l, periodes);
							}
							catch(java.lang.NumberFormatException ex){
								JOptionPane.showMessageDialog(null, "Un entier doit être saisi" );
								checkingModel.toggleCheckingPath(e.getPath());
							}
						}

						if(e.getPath().getLastPathComponent().toString().equals("RSI")){
							String retour = JOptionPane.showInputDialog("Veuillez saisir les périodes à afficher", "14");
							if(retour != null){
								try {
									int periode = Integer.parseInt(retour);
									List<Float> l =  ind.RSI(periode);
									int[] periodes =  {periode};
									parent.centre.ajouterIndicateur("RSI", l, periodes);
								}
								catch(java.lang.NumberFormatException ex){
									JOptionPane.showMessageDialog(null, "Un entier doit être saisi" );
									checkingModel.toggleCheckingPath(e.getPath());
								}
							}
							else checkingModel.toggleCheckingPath(e.getPath());
						}
						
						if(e.getPath().getLastPathComponent().toString().equals("Momentum")){
							String retour = JOptionPane.showInputDialog("Veuillez saisir les périodes à afficher", "12");
							if(retour != null){
								try {
									int periode = Integer.parseInt(retour);
									List<Float> l =  ind.momentum(periode);
									int[] periodes =  {periode};
									parent.centre.ajouterIndicateur("Momentum", l, periodes);
								}
								catch(java.lang.NumberFormatException ex){
									JOptionPane.showMessageDialog(null, "Un entier doit être saisi" );
									checkingModel.toggleCheckingPath(e.getPath());
								}
							}
							else checkingModel.toggleCheckingPath(e.getPath());
						}
						
						if(e.getPath().getLastPathComponent().toString().equals("ROC")){
							String retour = JOptionPane.showInputDialog("Veuillez saisir les périodes à afficher", "12");
							if(retour != null){
								try {
									int periode = Integer.parseInt(retour);
									List<Float> l =  ind.ROC(periode);
									int[] periodes =  {periode};
									parent.centre.ajouterIndicateur("ROC", l, periodes);
								}
								catch(java.lang.NumberFormatException ex){
									JOptionPane.showMessageDialog(null, "Un entier doit être saisi" );
									checkingModel.toggleCheckingPath(e.getPath());
								}
							}
							else checkingModel.toggleCheckingPath(e.getPath());
						}
					}

				}
				else
				{
					System.out.println(e.getPath().getLastPathComponent()+" vient d'être décoché");	
					if(e.getPath().getLastPathComponent().toString().contains("MM")){
						System.out.println("coucou");
						parent.centre.supprimerIndicateurSurCours(e.getPath().getLastPathComponent().toString());
					}
					if(e.getPath().getLastPathComponent().toString().contains("MMP")){
						parent.centre.supprimerIndicateurSurCours(e.getPath().getLastPathComponent().toString());
					}
					if(e.getPath().getLastPathComponent().toString().contains("MME")){
						parent.centre.supprimerIndicateurSurCours(e.getPath().getLastPathComponent().toString());
					}
					if(e.getPath().getLastPathComponent().toString().contains("MACD")){
						parent.centre.supprimerIndicateur(e.getPath().getLastPathComponent().toString());
					}
					if(e.getPath().getLastPathComponent().toString().contains("RSI")){
						parent.centre.supprimerIndicateur(e.getPath().getLastPathComponent().toString());
					}
					if(e.getPath().getLastPathComponent().toString().contains("Momentum")){
						parent.centre.supprimerIndicateur(e.getPath().getLastPathComponent().toString());
					}
					if(e.getPath().getLastPathComponent().toString().contains("ROC")){
						parent.centre.supprimerIndicateur(e.getPath().getLastPathComponent().toString());
					}
				}
			}
		});

		this.add(arbre, BorderLayout.WEST);
	}

	public CheckboxTree constructionArbre(){


		DefaultMutableTreeNode racine = new DefaultMutableTreeNode("Pull Call ratio");

		DefaultMutableTreeNode trend = new DefaultMutableTreeNode("Trend");

		trend.add(new DefaultMutableTreeNode("MM"));
		trend.add(new DefaultMutableTreeNode("MMP"));
		trend.add(new DefaultMutableTreeNode("MME"));
		trend.add(new DefaultMutableTreeNode("MACD"));

		DefaultMutableTreeNode volume = new DefaultMutableTreeNode("Volume");
		volume.add(new DefaultMutableTreeNode("RSI"));
		volume.add(new DefaultMutableTreeNode("Momentum"));
		volume.add(new DefaultMutableTreeNode("ROC"));

		racine.add(trend);
		racine.add(volume);
		CheckboxTree retour = new CheckboxTree(racine);

		return retour;
	}


}
